/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xos_cat.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../helper_objs/head.h"
#include "../data_struct/head.h"
#include "../config/head.h"
#include "../macro/head.h"
#include "../impl/head.h"
#include "../impl/head.h"
#include "../msg/head.h"
#include "msg_main.h"

namespace xos_cat
{

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    msg_main::msg_main()
    {
    }

    msg_main::~msg_main()
    {
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    // 
    // proc
    // 
    int msg_main::proc( xos_box::i_msg *& pMsg )
    {
        int ret = 1;

        int nMsg = pMsg->get_msg();

        switch( nMsg )
        {
            // 
            // module start/stop
            // 
            case MAIN_ALL_MODULE_STARTTED:
            {
                all_module_startted();
            }
            break;
            case MAIN_ALL_MODULE_STOPPED:
            {
                all_module_stopped();
            }
            break;

            ///////////////////////////////////////////////////////////////////////////////////
            // 
            // 启动过程
            // 
        case MAIN_STARTING:
            {
                startting();
            }
            break;
        case MAIN_STARTED:
            {
                startted();
            }
            break;

            ///////////////////////////////////////////////////////////////////////////////////
            // 
            // 程序运行中
            // 
        case MAIN_HEART:
            {
                heart();
            }
            break;

            ///////////////////////////////////////////////////////////////////////////////////
            // 
            // 结束
            // 
        case MAIN_LOG_STOPPED:
            {
                log_stopped();
            }
            break;
        case MAIN_NET_STOPPED:
            {
                net_stopped();
            }
            break;

            ///////////////////////////////////////////////////////////////////////////////////
            // 
            // 退出过程
            // 
        case MAIN_QUITTING:
            {
                quitting();
            }
            break;
        case MAIN_QUITTED:
            {
                quitted();
            }
            break;

            ///////////////////////////////////////////////////////////////////////////////////
            // 
            // 其它
            // 
        default:
            {
                ret = 0;
            }
            break;
        }

        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int msg_main::all_module_startted()
    {
        int ret = 0;
        helper_main::get()->notify( MAIN_STARTED );
        return ret;
    }

    int msg_main::all_module_stopped()
    {
        int ret = 0;
        mgr::container()->log()->flush();
        helper_log::get()->notify( MAIN_LOG_STOPPED );
        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int msg_main::startting()
    {
        int ret = 0;
        state::set_starting();
        LOG4( "starting..." );
        helper_module::load_all();
        helper_module::start_all();
        return ret;
    }

    int msg_main::startted()
    {
        int ret = 0;
        state::set_running();
        if( config::get()->m_b_auto_quit )
        {
            helper_main::get()->notify( MAIN_QUITTING );
        }
        return ret;
    }

    int msg_main::heart()
    {
        int ret = 0;
        {
            xos_box::i_string * pS = mgr::container()->box()->string();
            xos::i_time * pT = mgr::container()->xos()->tm();
            pT->get_time();
            pT->get_time_name_ymdhms( pS );
            LOG4( "heart...%s", pS->get( 0, 0 ) );
            xos_stl::release_interface( pS );
            xos_stl::release_interface( pT );
        }
        for( module::LIST::ITER iter = module::list()->begin(); iter != module::list()->end(); ++iter )
        {
            module * pM = *iter;
            pM->m_pNotify->notify( net::NET_HEART );
        }
        mgr::container()->http()->heart( config::get()->heart_check_interval_ms );
        helper_net::get()->notify( net::NET_HEART );
        mgr::container()->log()->flush();
        return ret;
    }

    int msg_main::quitting()
    {
        int ret = 0;
        state::set_quitting();
        helper_heart::term();
        LOG4( "qutting..." );
        helper_net::get()->notify( net::NET_STOP );
        return ret;
    }

    int msg_main::net_stopped()
    {
        int ret = 0;
        mgr::container()->log()->flush();
        helper_log::get()->notify( MAIN_LOG_STOPPED );
        return ret;
    }

    int msg_main::log_stopped()
    {
        int ret = 0;
        helper_main::get()->notify( MAIN_QUITTED );
        return ret;
    }

    int msg_main::quitted()
    {
        int ret = 0;
        state::set_quitted();
        return ret;
    }

} // xos_cat
